package cn.tedu.csmallproductzxj.web;

import cn.tedu.csmallproductzxj.ex.ServiceException;
import lombok.Data;
import lombok.experimental.Accessors;

@Data
@Accessors(chain = true)  //链式
public class JsonResult {
    /**
     * 状态码  登录成功就只有1一种状态，可以用静态方法直接固定就可以
     */
    private Integer state;

    /**
    * 描述失败的文本
    */
    private String message;

    /**
     * 操作成功时响应的数据,此数据不固定格式，
     * 有时候是列表，有时候是单个对象，所以定义为object类型
     */
    private Object data;


    //使用静态方法的好处是：方法名字可以随意取，构造方法只能和类同名
    //未经定义的常量，不能直接出现在代码里，不利于后期修改 所以先定义常量

    //给他传一个null是为了没有参数时用的，调用下面重载有参数的
    public static JsonResult ok(){
//        JsonResult jsonResult=new JsonResult();
//        jsonResult.setState(ServiceCode.OK.getValue());
        return ok(null);
    }

    public static JsonResult ok(Object object){
        JsonResult jsonResult=new JsonResult();
        jsonResult.setState(ServiceCode.OK.getValue());
        jsonResult.setData(object);
        return jsonResult;
    }

    //fail的重载，处理异常的时候可以选择这两种方式，使得调用方法更加灵活
    public static JsonResult fail(ServiceException e){
//        JsonResult jsonResult=new JsonResult();
//        jsonResult.setState(e.getState());
//        jsonResult.setMessage(e.getMessage());
//        return jsonResult;
        return fail(e.getServiceCode(),e.getMessage());
    }
    //失败有多种情况， 不能把状态码固定
    public static JsonResult fail(ServiceCode serviceCode,String message){
        JsonResult jsonResult=new JsonResult();
        jsonResult.setState(serviceCode.getValue());
        jsonResult.setMessage(message);
        return jsonResult;
    }


    //编程小技巧：重载的时候可以用参数少的调用参数多的方法
}
